package utils

import (
	"fmt"
	"time"

	"github.com/dgrijalva/jwt-go"
)

// 自定义有效载荷(这里采用自定义的ID和Username作为有效载荷的一部分)
type UserClaims struct {
	ID       string `json:"ID"`
	Username string `json:"username"`
	// StandardClaims结构体实现了Claims接口(Valid()函数)
	jwt.StandardClaims
}

var secretKey = []byte("616chatroom")

// GenerateToken
// 生成 token
func GenerateToken(ID, username string) (string, error) {
	nowTime := time.Now()                        //当前时间
	expireTime := nowTime.Add(300 * time.Second) //有效时间
	UserClaim := &UserClaims{
		ID:       ID,
		Username: username,
		StandardClaims: jwt.StandardClaims{
			ExpiresAt: expireTime.Unix(),
		},
	}
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, UserClaim)
	tokenString, err := token.SignedString(secretKey)
	if err != nil {
		return "", err
	}
	return tokenString, nil
}

// 解析token
func ParseToken(token string) (*UserClaims, error) {
	tokenClaims, err := jwt.ParseWithClaims(token, &UserClaims{}, func(token *jwt.Token) (interface{}, error) {
		return secretKey, nil
	})
	if err != nil {
		return nil, err
	}

	if claims, ok := tokenClaims.Claims.(*UserClaims); ok && tokenClaims.Valid {
		return claims, nil
	} else {
		return nil, fmt.Errorf("invalid token")
	}
}
